gint32 focused_window_id; /* -1 => none */
gint show_keyboard;
+ guint32 next_texture_id;
+ GHashTable *textures;
+
guint32 screen_width;
guint32 screen_height;
server->last_seen_time = 1;
server->id_ht = g_hash_table_new (NULL, NULL);
server->id_counter = 0;
+ server->textures = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL,
+ (GDestroyNotify)g_bytes_unref);
root = g_new0 (BroadwayWindow, 1);
root->id = server->id_counter++;
g_free (server->address);
g_free (server->ssl_cert);
g_free (server->ssl_key);
+ g_hash_table_destroy (server->textures);
G_OBJECT_CLASS (broadway_server_parent_class)->finalize (object);
}
window->buffer = buffer;
}
+guint32
+broadway_server_upload_texture (BroadwayServer *server,
+ GBytes *texture)
+{
+ guint32 id;
+
+ id = ++server->next_texture_id;
+ g_hash_table_replace (server->textures,
+ GINT_TO_POINTER (id),
+ g_bytes_ref (texture));
+
+ return id;
+}
+
+void
+broadway_server_release_texture (BroadwayServer *server,
+ guint32 id)
+{
+ g_hash_table_remove (server->textures, GINT_TO_POINTER (id));
+}
+
gboolean
broadway_server_window_move_resize (BroadwayServer *server,
gint id,
static void
client_disconnected (BroadwayClient *client)
{
+ GHashTableIter iter;
+ gpointer key, value;
GList *l;
if (client->disconnect_idle != 0)
g_list_free (client->windows);
client->windows = NULL;
+ g_hash_table_iter_init (&iter, client->textures);
+ while (g_hash_table_iter_next (&iter, &key, &value))
+ broadway_server_release_texture (server, GPOINTER_TO_INT (value));
+
broadway_server_flush (server);
client_free (client);
BroadwayReplyUngrabPointer reply_ungrab_pointer;
cairo_surface_t *surface;
guint32 before_serial, now_serial;
+ guint32 global_id;
int fd;
before_serial = broadway_server_get_next_serial (server);
close (fd);
texture = g_bytes_new_take (data, request->upload_texture.size);
+ global_id = broadway_server_upload_texture (server, texture);
+ g_bytes_unref (texture);
+
g_hash_table_replace (client->textures,
GINT_TO_POINTER (request->release_texture.id),
- texture);
+ GINT_TO_POINTER (global_id));
}
break;
case BROADWAY_REQUEST_RELEASE_TEXTURE:
- g_hash_table_remove (client->textures, GINT_TO_POINTER (request->release_texture.id));
+ global_id = GPOINTER_TO_INT (g_hash_table_lookup (client->textures,
+ GINT_TO_POINTER (request->release_texture.id)));
+ if (global_id != 0)
+ broadway_server_release_texture (server, global_id);
+ g_hash_table_remove (client->textures,
+ GINT_TO_POINTER (request->release_texture.id));
break;
case BROADWAY_REQUEST_MOVE_RESIZE:
client = g_new0 (BroadwayClient, 1);
client->id = client_id_count++;
client->connection = g_object_ref (connection);
- client->textures = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)g_bytes_unref);
+ client->textures = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, NULL);
input = g_io_stream_get_input_stream (G_IO_STREAM (client->connection));
client->in = input;